#include<iostream>
#include<cstring>
using namespace std;

/*
    模板的显式具体化和隐式实例化
        模板的显式具体化: 模板函数本来可以针对所有的数据类型，但是有些数据类型该模板函数代码不能处理，
                        此时就必须把这些特殊的类型单独定义一个具体化的版本
            模板函数的具体代码不能解决的问题，需要针对特定的数据类型定义一个具体的版本
            显示具体化：专门针对一种特殊情况
            语法规则：
                template<>
                void fun (struct student n){}   专门针对struct student的fun
        隐式实例化：调用模板函数的时候，传递的实参类型，编译器会自动生成相应版本的函数，这个过程就是隐式实例化
       
*/
template<typename T>
void fun(T n)
{
    cout << "平方是：" << n * n << endl;
}

struct student
{
    char name[20];
    int age;
};
// 针对学生结构体
template<>
void fun(struct student n)
{
    cout << "年龄平方是：" << n.age * n.age << endl;
}
// 针对字符串
template<>
void fun(string str)
{
    cout << "字符串的平方是：" << str.size() * str.size() << endl;
}

template<>
void fun(char *str)
{
    cout << "char*的平方是：" << strlen(str) * strlen(str) << endl;
}

int main()
{
    int n1 = 56;
    fun(n1);
    double n2 = 56.5;
    fun(n2);
    struct student n3 = {"张三", 18};
    fun(n3);
    string n4 = "hello world";
    fun(n4);
    // const char *n5 = "hello";
    char n5[10] = "hello";
    fun(n5);

    return 0;
}